package sad.dao;

import com.db4o.ObjectSet;
import com.db4o.query.Query;
import sad.modelo.SubTopico;
import sad.modelo.Topico;
import sad.util.Constantes;
import sad.util.DAOEvent;
import sad.visao.SubTopicoTableModel;

public class SubTopicoTableDAO extends AbstractDAO {
    
  private static SubTopicoTableDAO INSTANCE=null;
  private static SubTopicoTableModel tableModel;
  private int indexSubTop;
  
  //singleton
  public static SubTopicoTableDAO getInstance(){
        if (SubTopicoTableDAO.INSTANCE ==null){
            SubTopicoTableDAO.INSTANCE = new SubTopicoTableDAO();
        }
        return SubTopicoTableDAO.INSTANCE;
    }
    
  //C(reate)R(etrieve)U(pdate)D(elete)

  public static void create(){
        tableModel = new SubTopicoTableModel();
        Query query = DAO.getObjectContainer().query();
        query.constrain(SubTopico.class);
        query.descend("nome").orderAscending();
        ObjectSet produtoList = query.execute();
    
        while(produtoList.hasNext()) {
            SubTopico proto = (SubTopico)produtoList.next();
            tableModel.addSubTopico(proto);
        }
        tableModel.sortByNome();
  }

  public void create(String nome, String ab, Topico top){

        SubTopico s_t = new SubTopico();
        s_t.setNome(nome);
        s_t.setAbrev(ab);
        s_t.setTopico(top);
        if(DAO.create(s_t)){
            addSubTopico(s_t);
        }else{
            SubTopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(s_t.getNome(), DAOEvent.DAO_NOCREATE));
        }
  }
  
    public void addSubTopico(SubTopico s_top) {
        //verifica se o primeiro professor foi adicionado e avisa aos ouvintes
        //sadgui deve habilitar menu avaliacao
        int size = DAO.getListObjects(s_top).length;
        if(size==1){
                ProfessorTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(Constantes.AVALIACAO, DAOEvent.DAO_FIRST));
        }
        //se existe uma tabela
        if (tableModel!=null){
            //add prof
            tableModel.addSubTopico(s_top);
            //organiza pelo nome
            tableModel.sortByNome();
        }
        //avisa aos ouvintes que um professor foi criado com sucesso
        SubTopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(s_top, s_top.getAbrev(), DAOEvent.DAO_CREATE));
    }

    public boolean isExist(String nome, String abrev, Topico top) {
        boolean existe = false;
        SubTopico proto = new SubTopico();
        proto.setAbrev(abrev);
        SubTopico s_top = (SubTopico)DAO.retrieve(proto);
        if(s_top != null){
             existe =true;
             TopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(abrev, DAOEvent.DAO_EXISTE));
        }
        return existe;
    }
    
    public static SubTopico getSubTopicoSaved(String nome) {
        SubTopico proto = new SubTopico();
        proto.setNome(nome);
        return (SubTopico) DAO.retrieve(proto);
    }
    
    public SubTopicoTableModel getTableSubTopico() {
        return tableModel;
    }

    public void removeSubTopico() {
        SubTopico sub_top = tableModel.getSubTopico(getIndexSubTop());
        TopicoTableDAO.getInstance().delete(sub_top);
        tableModel.removeSubTopico(getIndexSubTop());
        
        //Se for apagado tudo na tabela, avisa para o controle que o GUI geral deve ser atualizada
        // (o Avaliacao deve ser desabilitado)
        if(tableModel.getRowCount()==0){
            SubTopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(Constantes.AVALIACAO, DAOEvent.DAO_NULL));
        }
        
        SubTopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(getIndexSubTop(), DAOEvent.DAO_DELETE));
    }

    public void setIndexSubTop(int index) {
        //seta o index do prof selecionado na tabela
        indexSubTop=index;
    }
    
    public int getIndexSubTop() {
        //retorna o index do prof selecionada na tabela
        return indexSubTop;
    }
    
    public void update(SubTopico s_top){
        //atualiza o banco (create igual a update)
        if(DAO.create(s_top)){
            //atualiza os valores editados na tabela
            tableModel.setValueAt(s_top, getIndexSubTop(), 0);
            tableModel.setValueAt(s_top, getIndexSubTop(), 1);
            tableModel.setValueAt(s_top, getIndexSubTop(), 2);
            tableModel.sortByNome();
            //avisa a gui da atualização
            SubTopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(s_top.getAbrev(), DAOEvent.DAO_UPDATE));
        }else{
            SubTopicoTableDAO.getInstance().getSuporteEventos().disparaDAOEvento(
                    new DAOEvent(s_top.getAbrev(), DAOEvent.DAO_NOCREATE));
        }
    }
}